home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2004 #2
/
Amiga Plus CD - 2004 - No. 02.iso
/
AmiSoft
/
Disk
/
moni
/
FileX-src.lha
/
FileX-src
/
search.c
< prev
next >
Wrap
C/C++ Source or Header
|
2003-11-09
|
23KB
|
1,041 lines
#include "FileXStructs.h"
#include "FileXStrings.h"
#include "allprotos.h"
char searchstring[256]; /* ASCII-Text-Suchstring */
static char hexsearchstring[128]; /* Hex-Suchbytes */
char replacestring[256];
static char hexreplacestring[128];
long searchmode = SM_STRING;
static struct Speicher ReplaceSpeicher;
static LONG delta[256];
static struct List SHList = {
( struct Node * )&SHList.lh_Tail,
0,
( struct Node * )&SHList.lh_Head,
0,0
};
static struct List RHList = {
( struct Node * )&RHList.lh_Tail,
0,
( struct Node * )&RHList.lh_Head,
0,0
};
static struct Node *SHAktu;
static struct Node *RHAktu;
void FreeSearchHistory( void )
{
while( !IsListEmpty( &SHList ))
FreeNLNode( SHList.lh_Head );
while( !IsListEmpty( &RHList ))
FreeNLNode( RHList.lh_Head );
}
void InitSearchHistory( void )
{
}
/*
* static long CountSpecChars(UBYTE *string,char zeichen)
*
* Ermittelt die Anzahl von einem bestimmten Zeichen in einem String
*/
static long CountSpecChars(UBYTE *string,char zeichen)
{
long num=0;
while( *string != 0) if( *string++ == zeichen) num++;
return( num );
}
/*
* static void Replace(long pos,UBYTE *quelle,long len)
*
* Ersetzt einen Text an pos mit der Länge len durch den ab Quelle
* und ändert auch den Text im Anzeigebereich falls nötig
*/
static void Replace(long pos,UBYTE *quelle,long len, struct DisplayData *DD)
{
struct Speicher s, rs;
s.len = len;
if(s.mem = AllocMem(s.len,MEMF_ANY))
{
rs.len = ReplaceSpeicher.len;
if( rs.mem = AllocMem( rs.len, MEMF_ANY ))
{
memcpy( rs.mem, ReplaceSpeicher.mem, rs.len );
AddUndoPaste(pos, s, rs,DD->FD);
/* Sichern */
memcpy(s.mem,DD->FD->Mem+pos,len);
/* String drüber */
memcpy(DD->FD->Mem+pos,quelle,len);
AllDisplay( DD->FD, SCROLLERNEU);
}
else
FreeMem( s.mem, s.len );
}
}
/*
* int TestHexString(char *s)
*
* Liefert Anzahl Bytes, falls s ein gültiger Hexstring ist = nur '0'-'9',
* ' ','A-F','a-f'. Oder -1 falls üngültige Zeichen enthalten sind.
*/
int TestHexString(char *s)
{
int anz=0;
char *starts=s;
while(*s!=0)
{
if(isxdigit(*s)) anz++;
else if(!(*s==' '))
{
MyRequest( MSG_INFO_GLOBAL_ILLEGALCHARACTERS, ( ULONG )starts );
return(-1);
}
s++;
}
if(anz%2!=0)
{
MyRequest( MSG_INFO_GLOBAL_HEXSTRINGNICHTBYTEALIGNED, ( ULONG )starts );
return(-1);
}
else return(anz);
}
static long memcmpwild(UBYTE *wild,UBYTE *string,long laenge)
{
long k;
for(k=0;k<laenge;k++)if((!(wild[k]==WILDCHAR))&&(string[k]!=wild[k]))return(-1);
return(0);
}
static long strnicmpwild(UBYTE *wild,UBYTE *string,long laenge)
{
long k;
for(k=0;k<laenge;k++)if((!(wild[k]==WILDCHAR))&&(ToUpper(string[k])!=ToUpper(wild[k])))return(-1);
return(0);
}
/*
* UBYTE *BoyerMoore(UBYTE *start,UBYTE *ss,ULONG typ)
*
* Sucht ab start und gibt Zeiger auf gefundenes zurück
* ss=Zeiger auf zu suchenden String
*/
static UBYTE *BoyerMoore(UBYTE *start,UBYTE *ss,ULONG typ,LONG len, struct DisplayData *DD )
{
UBYTE *t;
if(DD->FD->Len==0)return(NULL);
if(typ&BM_BACKWARD)
{
/* Falls wir zu weit hinten stehen, auf erste pos setzen */
if(len>DD->FD->Len-(start-DD->FD->Mem))start=DD->FD->Len+DD->FD->Mem-len;
/* Falls wir nun außerhalb sind */
if(start<=DD->FD->Mem)return(NULL);
len--;
t = start;
if(typ&BM_WILDCARDS)
{
if(typ&BM_CASE)
while(t>=DD->FD->Mem)
{
if(((*ss==WILDCHAR)||(*ss == *t)) &&
(memcmpwild(ss+1,t+1,len) == 0))
return(t);
t-=delta[*t];
}
else
while(t>=DD->FD->Mem)
{
if(((*ss==WILDCHAR)||(ToUpper(*ss) == ToUpper(*t)))
&&(strnicmpwild(ss+1,t+1,len) == 0))
return(t);
t-=delta[*t];
}
}
else
{
if(typ&BM_CASE)
while(t>=DD->FD->Mem)
{
if((*ss == *t) &&
(memcmp(ss+1,t+1,len) == 0))
return(t);
t-=delta[*t];
}
else
while(t>=DD->FD->Mem)
{
if((ToUpper(*ss) == ToUpper(*t))
&&(strnicmp(ss+1,t+1,len) == 0))
return(t);
t-=delta[*t];
}
}
}
else
{
UBYTE *zfende;
if(len>DD->FD->Len+DD->FD->Mem-start)return(NULL);
len--;
zfende=ss+len;
t = start + len;
if(typ&BM_WILDCARDS)
{
if(typ&BM_CASE)
while(t<DD->FD->Mem+DD->FD->Len)
{
if(((*zfende==WILDCHAR)||(*zfende == *t))&&
(memcmpwild(zfende-len,t-len,len)==0))
return(t - len);
t+=delta[*t];
}
else
while(t<DD->FD->Mem+DD->FD->Len)
{
if(((*zfende==WILDCHAR)||(ToUpper(*zfende)== ToUpper(*t)))&&
(strnicmpwild(zfende-len,t-len,len) == 0))
return(t - len);
t+=delta[*t];
}
}
else
{
if(typ&BM_CASE)
while(t<DD->FD->Mem+DD->FD->Len)
{
if((*zfende == *t)&&
(memcmp(zfende-len,t-len,len)==0))
return(t - len);
t+=delta[*t];
}
else
while(t<DD->FD->Mem+DD->FD->Len)
{
if((ToUpper(*zfende)== ToUpper(*t))&&
(strnicmp(zfende-len,t-len,len) == 0))
return(t - len);
t+=delta[*t];
}
}
}
return(NULL);
}
/*
* static void InitBM(UBYTE *ss,ULONG typ,ULONG len)
*
* Baut die Deltatabelle für den BoyerMooreAlgorithmus auf
* ss = zu suchender String
* typ = Suchart (CASE/BACK)
*/
static void InitBM( UBYTE *ss, ULONG typ, ULONG len )
{
unsigned char *zf;
LONG i;
/* Deltas berechnen */
for( i = 0; i < 256; i++ )
delta[ i ] = len;
if( typ & BM_CASE )
{
if(typ&BM_BACKWARD) for(zf=ss,i=len-1;i>0;--i) delta[zf[i]]=i;
else for(i=len,zf=ss; --i > 0;) delta[*zf++] = i;
}
else
{
if(typ&BM_BACKWARD)
{
for(zf=ss,i=len-1;i>0;--i) delta[ToUpper(zf[i])]=i;
for(i=0;i<256;i++)delta[tolower(i)]=delta[i];
}
else
{
for(i=len,zf=ss; --i > 0;)
{
UBYTE dummy;
dummy=*zf++;
delta[ToUpper(dummy)]=i;
}
for(i=0;i<256;i++)delta[tolower(i)]=delta[i];
}
}
if( typ & BM_WILDCARDS )
{
if( typ & BM_BACKWARD )
{
long pos = 0;
for( zf = ss; zf < ss + len; pos ++ )
{
if( *zf++ == WILDCHAR )
break;
}
if( !pos )
pos = 1;
for( i = 0; i < 256; i++ )
if( delta[ i ] > pos )
delta[ i ] = pos;
}
else
{
long pos = 0;
for( zf = ss + len - 1; zf >= ss; pos ++ )
if( *zf-- == WILDCHAR )
break;
if( !pos )
pos = 1;
for( i = 0; i < 256; i++ )
if( delta[ i ] > pos )
delta[ i ] = pos;
}
}
}
BOOL SearchNext(int typ,BOOL quiet,BOOL all, struct DisplayData *DD )
{
UBYTE *pos;
char *string;
LONG len;
BOOL Success = TRUE;
struct Window *SWnd;
SWnd = AktuDI->Wnd;
SetStatusZeile( GetStr( MSG_INFO_SEARCH_SEARCHING ), DD);
if(searchmode&SM_REPLACE)
{
char *rstring,*kstring,*krstring;
long richtung=(typ&BM_BACKWARD)?-1:1;
if( !(searchmode&SM_STRING))
{
int hexsearchbytes, hexreplacebytes;
typ|=BM_CASE;
if((-1!=(hexsearchbytes =TestHexString(searchstring)))&&
(-1!=(hexreplacebytes=TestHexString(replacestring))))
{
if(hexsearchbytes == hexreplacebytes)
{
len = ConvertHexstringToHexnumber(kstring=searchstring,string=hexsearchstring);
ConvertHexstringToHexnumber(krstring=replacestring,rstring=hexreplacestring);
}
else
{
DisplayLocaleText( MSG_INFO_SEARCH_BYTESNOTEQUAL );
Success = FALSE;
}
}
else
Success = FALSE;
}
else
{
if(searchmode&SM_WILDCARDS)
{
if(CountSpecChars(searchstring,WILDCHAR))typ|=BM_WILDCARDS;
}
if(!(strlen(krstring=rstring=replacestring)==(len=strlen(kstring=string=searchstring))))
{
DisplayLocaleText( MSG_INFO_SEARCH_CHARSNOTEQUAL );
Success = FALSE;
}
if(searchmode&SM_CASE)typ|=BM_CASE;
}
if(len && Success)
{
ReplaceSpeicher.len = len;
if(ReplaceSpeicher.mem = AllocMem(len,MEMF_ANY))
{
char fstring[256], *fstringzeiger;
fstring[len]=0;
fstringzeiger = fstring;
memcpy(ReplaceSpeicher.mem,rstring,len);
InitBM(string,typ,len);
if(all)
{
SetWaitPointer( SWnd );
if(pos=BoyerMoore(DD->FD->Mem+DD->CPos,string,typ,len, DD))
{
Replace(pos-DD->FD->Mem,rstring,len,DD);
while(pos=BoyerMoore(pos+richtung,string,typ,len,DD))
Replace(pos-DD->FD->Mem,rstring,len,DD);
}
ClrWaitPointer( SWnd );
Success=TRUE;
}
else
if(quiet)
{
if(pos=BoyerMoore(DD->FD->Mem+DD->CPos,string,typ,len,DD))
{
Replace(pos-DD->FD->Mem,rstring,len,DD);
Success=TRUE;
}
else
{
Success=FALSE;
}
}
else
{
BOOL all=FALSE,EndeFlag=FALSE;
SetWaitPointer( SWnd );
if(pos=BoyerMoore(DD->FD->Mem+DD->CPos,string,typ,len,DD))
do
{
Success=TRUE;
ClrWaitPointer( SWnd );
if(( searchmode & SM_STRING ) && ( searchmode & SM_WILDCARDS ))
strncpy(fstring,pos,len);
else
{
fstringzeiger = searchstring;
}
SetCursor(pos-DD->FD->Mem, DD);
switch(MyFullRequest( MSG_INFO_SEARCH_FOUNDTOREPLACE, MSG_GADGET_REPLACE, fstringzeiger, krstring ))
{
case 1:
Replace(pos-DD->FD->Mem,rstring,len,DD);
break;
case 2:
Replace(pos-DD->FD->Mem,rstring,len,DD);
all=TRUE;
SetWaitPointer( SWnd );
while(pos=BoyerMoore(pos+richtung,string,typ,len,DD))
Replace(pos-DD->FD->Mem,rstring,len,DD);
ClrWaitPointer( SWnd );
EndeFlag=TRUE;
break;
case 3:
Replace(pos-DD->FD->Mem,rstring,len,DD);
EndeFlag=TRUE;
break;
case 4:
EndeFlag=TRUE;
break;
}
SetWaitPointer( SWnd );
}while((!EndeFlag)&&(pos=BoyerMoore(pos+richtung,string,typ,len,DD)));
else Success=FALSE;
ClrWaitPointer( SWnd );
if((all==FALSE)&&(EndeFlag==FALSE))
{
if(!quiet)
MyRequest( MSG_INFO_SEARCH_STRINGNOTFOUND, ( ULONG )searchstring );
}
}
FreeMem( ReplaceSpeicher.mem, ReplaceSpeicher.len );
}
else
MyRequest( MSG_INFO_GLOBAL_CANTALLOCMEM, len );
}
}
else
{
if(!(searchmode&SM_STRING))
{
if(-1!=TestHexString(searchstring))
{
len=ConvertHexstringToHexnumber(searchstring,hexsearchstring);
string=hexsearchstring;
typ|=BM_CASE;
}
else
Success = FALSE;
}
else
{
if(searchmode&SM_WILDCARDS)
{
if(CountSpecChars(searchstring,WILDCHAR))typ|=BM_WILDCARDS;
}
len=strlen(string=searchstring);
if(searchmode&SM_CASE)typ|=BM_CASE;
}
if(Success && len)
{
InitBM(string,typ,len);
SetWaitPointer( SWnd );
pos=BoyerMoore(DD->FD->Mem+DD->CPos+((typ&BM_BACKWARD)?-1:1),string,typ,len,DD);
ClrWaitPointer( SWnd );
if(pos)
{
SetCursor(pos-DD->FD->Mem, DD);
Success=TRUE;
}
else
{
if(!quiet)
if(searchmode&SM_STRING)MyRequest( MSG_INFO_SEARCH_STRINGNOTFOUND, ( ULONG )searchstring );
else MyRequest( MSG_INFO_SEARCH_STRINGNOTFOUND, ( ULONG )searchstring );
Success=FALSE;
}
}
}
UpdateStatusZeile(DD);
SetScrollerGadget(DD);
return(Success);
}
void SetSearchString( char *string )
{
strcpy( searchstring, string );
if( strlen( string ))
if( IsListEmpty( &SHList ) || strcmp( string, SHList.lh_TailPred->ln_Name ))
AddNLName( &SHList, string );
}
void SetReplaceString( char *string )
{
strcpy( replacestring, string );
if( strlen( string ))
if( IsListEmpty( &RHList ) || strcmp( string, RHList.lh_TailPred->ln_Name ))
AddNLName( &RHList, string );
}
char *GetAktuSearchString( void )
{
return( searchstring );
}
char *GetAktuReplaceString( void )
{
return( replacestring );
}
/****************************** SearchWindow ******************************/
enum {
GD_SEARCH_SEARCHSTRING,
GD_SEARCH_REPLACESTRING,
GD_SEARCH_CASESENSITIV,
GD_SEARCH_WILDCARDS,
GD_SEARCH_STRINGSEARCH,
GD_SEARCH_REPLACEMODE,
GD_SEARCH_NEXT,
GD_SEARCH_PREVIOUS,
GD_SEARCH_CANCEL
};
static struct MyNewGadget SearchNewGadgets[] =
{
STRING_KIND, 0, 0, 0, MSG_GADGET_SEARCH_SEARCHSTRING, 0, 256, 0, 30, 30,
STRING_KIND, 0, 0, 0, MSG_GADGET_SEARCH_REPLACESTRING, 0, 256, 0, 30, 30,
CHECKBOX_KIND, GP_NEWCOLUMN, 0, 0, MSG_GADGET_SEARCH_CASESENSITIV, 0, 0, 0, 0, 0,
CHECKBOX_KIND, 0, 0, 0, MSG_GADGET_SEARCH_WILDCARDS, 0, 0, 0, 0, 0,
CHECKBOX_KIND, 0, 0, 0, MSG_GADGET_SEARCH_STRINGSEARCH, 0, 0, 0, 0, 0,
CHECKBOX_KIND, 0, 0, 0, MSG_GADGET_SEARCH_REPLACEMODE, 0, 0, 0, 0, 0,
BUTTON_KIND, GP_LEFTBOTTOM, 0, 0, MSG_GADGET_SEARCH_NEXT, 0, 0, 0, 0, 0,
BUTTON_KIND, GP_MIDDLEBOTTOM, 0, 0, MSG_GADGET_SEARCH_PREVIOUS, 0, 0, 0, 0, 0,
BUTTON_KIND, GP_RIGHTBOTTOM, 0, 0, MSG_GADGET_CANCEL, 0, 0, 0, 0, 0,
0
};
static struct WindowData SearchWD =
{
NULL, NULL, FALSE, NULL, NULL,
0,0,
&SearchNewGadgets[ 0 ], 9
};
static void DoSearchWndMsg( void )
{
struct IntuiMessage *m, Msg;
struct Gadget *gad;
int Select = -1; /* Wie wurde Window verlassen? (-1=Nicht/0=Cancel / Next / Previous) */
while( m = GT_GetIMsg( SearchWD.Wnd->UserPort ))
{
CopyMem(( char * )m, ( char * )&Msg, (long)sizeof( struct IntuiMessage ));
GT_ReplyIMsg( m );
KeySelect( SearchWD.Gadgets, &Msg );
gad = (struct Gadget *) Msg.IAddress;
switch( Msg.Class )
{
/* case IDCMP_REFRESHWINDOW:
GT_BeginRefresh( SearchWD.Wnd );
GT_EndRefresh( SearchWD.Wnd, TRUE );
break;*/
case IDCMP_VANILLAKEY:
if( Msg.Code == 13)
Select = 1;
break;
case IDCMP_CLOSEWINDOW:
Select = 0;
break;
case IDCMP_GADGETUP:
switch(gad->GadgetID)
{
case GD_SEARCH_SEARCHSTRING:
if( SearchNewGadgets[ GD_SEARCH_STRINGSEARCH ].CurrentValue == FALSE )
{
if(-1==TestHexString(GetString(SearchWD.Gadgets[GD_SEARCH_SEARCHSTRING])))
ActivateGadget(SearchWD.Gadgets[GD_SEARCH_SEARCHSTRING],SearchWD.Wnd,0);
else
if( SearchNewGadgets[ GD_SEARCH_REPLACEMODE ].CurrentValue )
ActivateGadget( SearchWD.Gadgets[ GD_SEARCH_REPLACESTRING ], SearchWD.Wnd, 0 );
else
Select = 1;
}
else
{
if( SearchNewGadgets[ GD_SEARCH_REPLACEMODE ].CurrentValue )
ActivateGadget( SearchWD.Gadgets[ GD_SEARCH_REPLACESTRING ], SearchWD.Wnd, 0 );
else
Select = 1;
}
break;
case GD_SEARCH_REPLACESTRING:
if(( SearchNewGadgets[ GD_SEARCH_STRINGSEARCH ].CurrentValue == FALSE ) &&
(-1==TestHexString(GetString(SearchWD.Gadgets[GD_SEARCH_SEARCHSTRING]))))
ActivateGadget(SearchWD.Gadgets[GD_SEARCH_REPLACESTRING],SearchWD.Wnd,0);
else
Select = 1;
break;
case GD_SEARCH_REPLACEMODE:
GT_SetGadgetAttrs( SearchWD.Gadgets[ GD_SEARCH_REPLACESTRING ], SearchWD.Wnd, NULL, GA_Disabled, ((struct MyNewGadget *)gad->UserData)->CurrentValue, TAG_DONE );
case GD_SEARCH_CASESENSITIV:
case GD_SEARCH_WILDCARDS:
case GD_SEARCH_STRINGSEARCH:
((struct MyNewGadget *)gad->UserData)->CurrentValue = !((struct MyNewGadget *)gad->UserData)->CurrentValue;
break;
case GD_SEARCH_NEXT:
Select = 1;
break;
case GD_SEARCH_PREVIOUS:
Select = 2;
break;
case GD_SEARCH_CANCEL:
Select = 0;
break;
}
break;
}
}
if( Select > 0 ) /* Next/Previous -> Werte merken */
{
SetSearchString( GetString( SearchWD.Gadgets[ GD_SEARCH_SEARCHSTRING ] ));
SetReplaceString( GetString( SearchWD.Gadgets[ GD_SEARCH_REPLACESTRING ] ));
searchmode &= ~( SM_CASE | SM_STRING | SM_WILDCARDS | SM_REPLACE );
if( SearchNewGadgets[ GD_SEARCH_CASESENSITIV ].CurrentValue )
searchmode |= SM_CASE;
if( SearchNewGadgets[ GD_SEARCH_WILDCARDS ].CurrentValue )
searchmode |= SM_WILDCARDS;
if( SearchNewGadgets[ GD_SEARCH_STRINGSEARCH ].CurrentValue )
searchmode |= SM_STRING;
if( SearchNewGadgets[ GD_SEARCH_REPLACEMODE ].CurrentValue )
searchmode |= SM_REPLACE;
}
if( Select != -1 )
{
MyRemoveSignal( 1L << SearchWD.Wnd->UserPort->mp_SigBit );
NewCloseAWindow( &SearchWD );
}
switch( Select )
{
case 1:
SearchNext(0, FALSE, FALSE,AktuDD);
break;
case 2:
SearchNext(BM_BACKWARD, FALSE, FALSE,AktuDD);
break;
}
}
void SendMsg( struct Window * w, UBYTE Key )
{
struct IntuiMessage *Msg;
if( Msg = AllocVec( sizeof( struct ExtIntuiMessage ), MEMF_CLEAR ))
{
Msg->ExecMessage.mn_Node.ln_Type = NT_MESSAGE;
Msg->ExecMessage.mn_Length = sizeof( struct IntuiMessage );
Msg->ExecMessage.mn_ReplyPort = GadgetReplyPort;
Msg->Class = IDCMP_VANILLAKEY;
Msg->Code = (UWORD)Key;
Msg->Qualifier = 0;
Msg->IAddress = NULL;
Msg->IDCMPWindow = w;
PutMsg( w->UserPort, ( struct Message * )Msg );
}
}
static ULONG __saveds __asm SearchHookFunc( register __a0 struct Hook *hook,
register __a2 struct SGWork *sgw,
register __a1 unsigned long *msg )
{
struct InputEvent *ie;
ULONG return_code = ~0;
static long ShiftSearchLaenge = -1;
if( *msg == SGH_KEY )
{
ie = sgw->IEvent;
if( ie->ie_Class == IECLASS_RAWKEY )
{
if(( ie->ie_Qualifier & IEQUALIFIER_RCOMMAND ) && ( sgw->EditOp == EO_INSERTCHAR ))
{
UBYTE Buffer[10];
if( 1 == MapRawKey(ie, Buffer, 10, 0))
{
SendMsg( sgw->GadgetInfo->gi_Window,Buffer[0] );
sgw->Actions = 0;
}
}
else
if( SearchWD.Wnd && (sgw->GadgetInfo->gi_Window == SearchWD.Wnd ))
{
struct Node *HAktu;
struct List *HList;
if( sgw->Gadget == SearchWD.Gadgets[ GD_SEARCH_SEARCHSTRING ])
{
HAktu = SHAktu;
HList = &SHList;
}
else
{
HAktu = RHAktu;
HList = &RHList;
}
if( sgw->EditOp != EO_NOOP )
{
ShiftSearchLaenge = -1;
}
else
if( ie->ie_Qualifier & ( IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT ))
{
struct Node *node;
if(( ie->ie_Code == CURSORUP ) || ( ie->ie_Code == CURSORDOWN ))
{
if( ShiftSearchLaenge == -1 )
ShiftSearchLaenge = strlen( sgw->WorkBuffer );
if( !IsListEmpty( HList ))
{
if( HAktu )
node = HAktu;
else
node = HList->lh_TailPred;
if( ie->ie_Code == CURSORUP )
{
if( !strcmp( node->ln_Name, sgw->WorkBuffer ))
{
node = node->ln_Pred;
}
if( node != ( struct Node * )HList )
while( strnicmp( sgw->WorkBuffer, node->ln_Name, ShiftSearchLaenge ))
{
node = node->ln_Pred;
if( node == ( struct Node * )HList )
break;
}
if( node == ( struct Node * )HList )
{
sgw->Actions = SGA_BEEP;
}
else
{
HAktu = node;
sgw->WorkBuffer = HAktu->ln_Name;
sgw->NumChars = strlen( HAktu->ln_Name );
}
}
else
{
if( !strcmp( node->ln_Name, sgw->WorkBuffer ))
{
node = node->ln_Succ;
}
if( node != ( struct Node * )&HList->lh_Tail )
while( strnicmp( sgw->WorkBuffer, node->ln_Name, ShiftSearchLaenge ))
{
node = node->ln_Succ;
if( node == ( struct Node * )&HList->lh_Tail )
break;
}
if( node == ( struct Node * )&HList->lh_Tail )
{
sgw->Actions = SGA_BEEP;
}
else
{
HAktu = node;
sgw->WorkBuffer = HAktu->ln_Name;
sgw->NumChars = strlen( HAktu->ln_Name );
}
}
}
}
}
else
if( ie->ie_Qualifier & IEQUALIFIER_CONTROL )
{
switch( ie->ie_Code )
{
case CURSORUP:
if( !IsListEmpty( HList ))
{
HAktu = HList->lh_Head;
sgw->WorkBuffer = HAktu->ln_Name;
sgw->NumChars = strlen( HAktu->ln_Name );
}
break;
case CURSORDOWN:
if( !IsListEmpty( HList ))
{
HAktu = HList->lh_TailPred;
sgw->WorkBuffer = HAktu->ln_Name;
sgw->NumChars = strlen( HAktu->ln_Name );
}
break;
}
}
else
{
ShiftSearchLaenge = -1;
switch( ie->ie_Code )
{
case CURSORUP:
if( HAktu == 0 )
{
if( !IsListEmpty( HList ))
{
HAktu = HList->lh_TailPred;
sgw->WorkBuffer = HAktu->ln_Name;
sgw->NumChars = strlen( HAktu->ln_Name );
}
}
else
if( HAktu->ln_Pred != ( struct Node * )HList )
{
HAktu = HAktu->ln_Pred;
sgw->WorkBuffer = HAktu->ln_Name;
sgw->NumChars = strlen( HAktu->ln_Name );
}
break;
case CURSORDOWN:
if( HAktu != 0 )
if( HAktu->ln_Succ != ( struct Node * )&HList->lh_Tail )
{
HAktu = HAktu->ln_Succ;
sgw->WorkBuffer = HAktu->ln_Name;
sgw->NumChars = strlen( HAktu->ln_Name );
}
else
{
sgw->WorkBuffer = "";
sgw->NumChars = 0;
HAktu = 0;
}
break;
}
}
if( sgw->Gadget == SearchWD.Gadgets[ GD_SEARCH_SEARCHSTRING ])
{
SHAktu = HAktu;
}
else
{
RHAktu = HAktu;
}
}
else
{
/* Prüfen, ob es sich um ein Gadget zur Hexzahleingabe handelt */
if( ((struct MyNewGadget *)sgw->Gadget->UserData)->Typ == HEX_KIND )
{
if( sgw->EditOp == EO_INSERTCHAR )
{
if( !isxdigit( sgw->Code ))
{
sgw->Actions = SGA_BEEP;
}
}
}
}
}
}
else
return_code = 0;
return(return_code);
}
struct Hook SearchHook =
{
0, 0, (ULONG (*)()) SearchHookFunc, 0, 0
};
BOOL OpenSearchWindow( BOOL ReplaceMode )
{
ULONG err;
if( SearchWD.Wnd )
{
ActivateWindow( SearchWD.Wnd );
return( TRUE );
}
if( !IsListEmpty( &SHList ))
{
SearchNewGadgets[ GD_SEARCH_SEARCHSTRING ].CurrentValue = (LONG) SHList.lh_TailPred->ln_Name;
SHAktu = SHList.lh_TailPred;
}
else
SearchNewGadgets[ GD_SEARCH_SEARCHSTRING ].CurrentValue = (LONG) 0;
if( !IsListEmpty( &RHList ))
{
SearchNewGadgets[ GD_SEARCH_REPLACESTRING ].CurrentValue = (LONG) RHList.lh_TailPred->ln_Name;
RHAktu = RHList.lh_TailPred;
}
else
SearchNewGadgets[ GD_SEARCH_REPLACESTRING ].CurrentValue = (LONG) 0;
SearchNewGadgets[ GD_SEARCH_CASESENSITIV ].CurrentValue = ( searchmode & SM_CASE ) ? TRUE : FALSE;
SearchNewGadgets[ GD_SEARCH_WILDCARDS ].CurrentValue = ( searchmode & SM_WILDCARDS ) ? TRUE: FALSE;
SearchNewGadgets[ GD_SEARCH_STRINGSEARCH ].CurrentValue = ( searchmode & SM_STRING ) ? TRUE: FALSE;
SearchNewGadgets[ GD_SEARCH_REPLACEMODE ].CurrentValue = ReplaceMode;
SearchNewGadgets[ GD_SEARCH_REPLACESTRING ].Disabled = !ReplaceMode;
if( err =NewOpenAWindow( &SearchWD, GetStr( MSG_WINDOWTITLE_SEARCH )))
{
MyRequest( MSG_INFO_GLOBAL_CANTOPENWINDOW, err);
return( FALSE );
}
else
{
ActivateGadget( SearchWD.Gadgets[ GD_SEARCH_SEARCHSTRING ], SearchWD.Wnd, 0 );
MyAddSignal( 1L << SearchWD.Wnd->UserPort->mp_SigBit, &DoSearchWndMsg );
}
}